{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "cell_id": "e00d31f2766d45be9c6d9fe9c4405f43",
    "deepnote_app_coordinates": {
     "h": 5,
     "w": 12,
     "x": 0,
     "y": 12
    },
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 3632,
    "execution_start": 1670940580644,
    "id": "7C1D282356B24CDB8C600C9CEA1265C8",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "459e9ef",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据特征： Avg. Area Income, Avg. Area House Age, Avg. Area Number of Rooms, Avg. Area Number of Bedrooms, Area Population\n",
      "数据标签： Price\n",
      "数据总条数： 5000\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 从源文件加载数据，并输出查看数据的各项特征\n",
    "lines = np.loadtxt('USA_Housing.csv', delimiter=',', dtype='str')\n",
    "header = lines[0]\n",
    "lines = lines[1:].astype(float)\n",
    "print('数据特征：', ', '.join(header[:-1]))\n",
    "print('数据标签：', header[-1])\n",
    "print('数据总条数：', len(lines))\n",
    "\n",
    "# 划分训练集与测试集\n",
    "ratio = 0.8\n",
    "split = int(len(lines) * ratio)\n",
    "np.random.seed(0)\n",
    "lines = np.random.permutation(lines)\n",
    "train, test = lines[:split], lines[split:]\n",
    "\n",
    "# 数据归一化\n",
    "scaler = StandardScaler()\n",
    "scaler.fit(train) # 只使用训练集的数据计算均值和方差\n",
    "train = scaler.transform(train)\n",
    "test = scaler.transform(test)\n",
    "\n",
    "# 划分输入和标签\n",
    "x_train, y_train = train[:, :-1], train[:, -1].flatten()\n",
    "x_test, y_test = test[:, :-1], test[:, -1].flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "cell_id": "631dd97e9da843529d3b5cc29f08380c",
    "deepnote_app_coordinates": {
     "h": 5,
     "w": 12,
     "x": 0,
     "y": 24
    },
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 25,
    "execution_start": 1670940584324,
    "id": "8EE5DC43F8734EF0A41032B8E4A94857",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "74324f1b",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归系数： [ 6.50881254e-01  4.67222833e-01  3.38466198e-01  6.17275856e-03\n",
      "  4.26857089e-01 -1.46033359e-14]\n",
      "RMSE： 0.28791834247503534\n"
     ]
    }
   ],
   "source": [
    "# 在X矩阵最后添加一列1，代表常数项\n",
    "X = np.concatenate([x_train, np.ones((len(x_train), 1))], axis=-1)\n",
    "# @ 表示矩阵相乘，X.T表示矩阵X的转置，np.linalg.inv函数可以计算矩阵的逆\n",
    "theta = np.linalg.inv(X.T @ X) @ X.T @ y_train\n",
    "print('回归系数：', theta)\n",
    "\n",
    "# 在测试集上使用回归系数进行预测\n",
    "X_test = np.concatenate([x_test, np.ones((len(x_test), 1))], axis=-1)\n",
    "y_pred = X_test @ theta\n",
    "\n",
    "# 计算预测值和真实值之间的RMSE\n",
    "rmse_loss = np.sqrt(np.square(y_test - y_pred).mean())\n",
    "print('RMSE：', rmse_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "cell_id": "24bf3567aade4e37bb37b9ce1aa012ee",
    "deepnote_app_coordinates": {
     "h": 5,
     "w": 12,
     "x": 0,
     "y": 36
    },
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 285,
    "execution_start": 1670940584358,
    "id": "76377D8991204084A0861ED8AC2C9A8E",
    "jupyter": {},
    "notebookId": "60364796c614ab001504cecf",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "660b9b9c",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归系数： [0.65088125 0.46722283 0.3384662  0.00617276 0.42685709] -1.4635041882766192e-14\n",
      "RMSE： 0.2879183424750354\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "# 初始化线性模型\n",
    "linreg = LinearRegression()\n",
    "# LinearRegression的方法中已经考虑了线性回归的常数项，所以无须再拼接1\n",
    "linreg.fit(x_train, y_train)\n",
    "\n",
    "# coef_是训练得到的回归系数，intercept_是常数项\n",
    "print('回归系数：', linreg.coef_, linreg.intercept_)\n",
    "y_pred = linreg.predict(x_test)\n",
    "\n",
    "# 计算预测值和真实值之间的RMSE\n",
    "rmse_loss = np.sqrt(np.square(y_test - y_pred).mean())\n",
    "print('RMSE：', rmse_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "cell_id": "183cc001f0f346388b5b989a5a2f6e8a",
    "deepnote_app_coordinates": {
     "h": 5,
     "w": 12,
     "x": 0,
     "y": 48
    },
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 7,
    "execution_start": 1670940584648,
    "id": "6A170DBCED294C5D974A0AA09ABCED68",
    "jupyter": {},
    "notebookId": "60364796c614ab001504cecf",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "d9c08b45",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 该函数每次返回大小为batch_size的批量\n",
    "# x和y分别为输入和标签\n",
    "# 若shuffle = True，则每次遍历时会将数据重新随机划分\n",
    "def batch_generator(x, y, batch_size, shuffle=True):\n",
    "    # 批量计数器\n",
    "    batch_count = 0\n",
    "    if shuffle:\n",
    "        # 随机生成0到len(x)-1的下标\n",
    "        idx = np.random.permutation(len(x))\n",
    "        x = x[idx]\n",
    "        y = y[idx]\n",
    "    while True:\n",
    "        start = batch_count * batch_size\n",
    "        end = min(start + batch_size, len(x))\n",
    "        if start >= end:\n",
    "            # 已经遍历一遍，结束生成\n",
    "            break\n",
    "        batch_count += 1\n",
    "        yield x[start: end], y[start: end]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "cell_id": "cd1a09135411483ca7eea45cae5587cb",
    "deepnote_app_coordinates": {
     "h": 5,
     "w": 12,
     "x": 0,
     "y": 54
    },
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 405,
    "execution_start": 1670941330071,
    "id": "69246F1036B24E3B84F7F2954B383DDD",
    "jupyter": {},
    "notebookId": "60364796c614ab001504cecf",
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "e4f2f06c",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归系数： [ 0.65357756  0.46682964  0.33885411  0.00720843  0.42751035 -0.00273407]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJiUlEQVR4nO3df3zP9f7/8ft779lPNsawMUN+Jz+yCEkhWSV1nDhRQ+mkSDickk7F6fA9zkmSrNMPOnVUUkhF0hELyc+VDzsoY2J+jGw2jO39+v7xau8s2+y9vd/v13vb7Xq5vC97v17v5+v1fuztnL3vPZ/P1/NlMwzDEAAAQCXhZ3UBAAAA7kS4AQAAlQrhBgAAVCqEGwAAUKkQbgAAQKVCuAEAAJUK4QYAAFQq/lYX4G0Oh0NHjhxRjRo1ZLPZrC4HAACUgmEYOnPmjKKjo+XnV3LfTJULN0eOHFFMTIzVZQAAgDI4dOiQGjZsWGKbKhduatSoIcn8cMLCwiyuBgAAlEZWVpZiYmKc3+MlqXLhpmAoKiwsjHADAEAFU5opJUwoBgAAlQrhBgAAVCqEGwAAUKlUuTk3AIDKLz8/XxcvXrS6DLgoICDgipd5lwbhBgBQaRiGoaNHj+r06dNWl4Iy8PPzU5MmTRQQEFCu8xBuAACVRkGwqVu3rkJCQlistQIpWGQ3PT1djRo1Kte/HeEGAFAp5OfnO4NN7dq1rS4HZRAZGakjR44oLy9P1apVK/N5mFAMAKgUCubYhISEWFwJyqpgOCo/P79c5yHcAAAqFYaiKi53/dsRbgAAQKVCuAEAAJUK4QYAgEqkcePGmj17tuXnsBJXS7mJwyFlZEg//yy1bGl1NQCAiuKmm25Shw4d3BYmtmzZotDQULecq6Ii3LhJaqrUrJkUGiplZ1tdDQCgMjEMQ/n5+fL3v/LXdmRkpBcq8m0MS7lJ3brmz5wc8wEAsJ5h/Pp32ZsPwyhdfcOHD9e6dev00ksvyWazyWaz6cCBA1q7dq1sNptWrVqluLg4BQYG6uuvv9aPP/6oAQMGqF69eqpevbquu+46ffnll4XO+dshJZvNpjfeeEN33323QkJC1Lx5cy1fvtylzzEtLU0DBgxQ9erVFRYWpkGDBunYsWPO17/77jvdfPPNqlGjhsLCwtSpUydt3bpVknTw4EH1799ftWrVUmhoqK6++mqtWLHCpfd3FT03blK9uhQcLJ07Jx0/LjVpYnVFAICzZ82/z96WnW325F/JSy+9pL1796pt27aaNm2aJLPn5cCBA5KkP//5z/rnP/+ppk2bqmbNmvrpp59022236fnnn1dQUJD+/e9/q3///tqzZ48aNWpU7PtMnTpVM2fO1D/+8Q+9/PLLGjp0qA4ePKiIiIgr1mgYhu666y6FhoZq3bp1ysvL06OPPqrBgwdr7dq1kqShQ4eqY8eOSkxMlN1uV3JysnMRvtGjR+vChQtKSkpSaGiodu/ereoe/kch3LiJzWb23hw8SLgBAJROeHi4AgICFBISovr161/2+rRp03TLLbc4t2vXrq327ds7t59//nktXbpUy5cv15gxY4p9n+HDh+vee++VJE2fPl0vv/yyNm/erH79+l2xxi+//FLff/+9UlNTFRMTI0l65513dPXVV2vLli267rrrlJaWpkmTJqlVq1aSpObNmzuPT0tL08CBA3XNNddIkpo2bXrF9ywvwo0bFYSbS3rqAAAWCgmxZh6kuxZJjouLK7Sdk5OjqVOn6tNPP3XepuDcuXNKS0sr8Tzt2rVzPg8NDVWNGjV0/PjxUtWQkpKimJgYZ7CRpDZt2qhmzZpKSUnRddddpwkTJmjkyJF655131KdPH91zzz266qqrJEljx47VI488oi+++EJ9+vTRwIEDC9XjCcy5caN69cyfpfzfCwDAw2w2c3jI2w93LZL826ueJk2apI8++kh/+9vf9PXXXys5OVnXXHONLly4UOJ5fnufJpvNJofDUaoaDMMocuXgS/c/99xz2rVrl26//XatWbNGbdq00dKlSyVJI0eO1P79+3X//fdr586diouL08svv1yq9y4rwo0bFUwqJtwAAEorICCg1PdS+vrrrzV8+HDdfffduuaaa1S/fn3n/BxPadOmjdLS0nTo0CHnvt27dyszM1OtW7d27mvRooXGjx+vL774Qr/73e+0YMEC52sxMTEaNWqUlixZoj/96U96/fXXPVoz4caNCsINw1IAgNJq3Lixvv32Wx04cEAZGRkl9qg0a9ZMS5YsUXJysr777jsNGTKk1D0wZdWnTx+1a9dOQ4cO1fbt27V582YlJCSoZ8+eiouL07lz5zRmzBitXbtWBw8e1IYNG7RlyxZn8Bk3bpxWrVql1NRUbd++XWvWrCkUijyBcONG9NwAAFw1ceJE2e12tWnTRpGRkSXOn3nxxRdVq1YtdevWTf3799ett96qa6+91qP12Ww2LVu2TLVq1dKNN96oPn36qGnTplq0aJEkyW636+TJk0pISFCLFi00aNAgxcfHa+rUqZLMO3yPHj1arVu3Vr9+/dSyZUvNmzfPszUbRmmvxq8csrKyFB4erszMTIWFhbn13O++Kw0dKvXqJf33v249NQDgCs6fP6/U1FQ1adJEQUFBVpeDMijp39CV7296btyIYSkAAKxHuHEjhqUAALAe4caNCi4Fz8iQSjnxHQAAuBnhxo1q1zbXNjAM6eRJq6sBAKBqIty4kb+/GXAk5t0AAGAVwo2bsUoxAADWsjTcJCUlqX///oqOjnZeR38lCxcuVPv27RUSEqKoqCiNGDFCJ31oDIhJxQAAWMvScJOTk6P27dtr7ty5pWq/fv16JSQk6MEHH9SuXbu0ePFibdmyRSNHjvRwpaXH5eAAAFjL0ruCx8fHKz4+vtTtN23apMaNG2vs2LGSpCZNmujhhx/WzJkziz0mNzdXubm5zu2srKyyF1wKDEsBACqKm266SR06dNDs2bOtLsWtKtScm27duumnn37SihUrZBiGjh07pg8//FC33357scfMmDFD4eHhzselt2z3BIalAACuuOmmmzRu3Di3nnP48OG666673HrOiqTChZuFCxdq8ODBCggIUP369VWzZs0Sb50+efJkZWZmOh+X3tXUExiWAgDAWhUq3OzevVtjx47VM888o23btunzzz9XamqqRo0aVewxgYGBCgsLK/TwJHpuAAClNXz4cK1bt04vvfSSbDabbDabDhw4IMn8zrvttttUvXp11atXT/fff78yMjKcx3744Ye65pprFBwcrNq1a6tPnz7KycnRc889p3//+9/6+OOPnedcu3Ztqer5+eeflZCQoFq1aikkJETx8fHat2+f8/WDBw+qf//+qlWrlkJDQ3X11VdrxYoVzmOHDh2qyMhIBQcHq3nz5lqwYIHbPitXWDrnxlUzZsxQ9+7dNWnSJElSu3btFBoaqh49euj5559XVFSUxRUy5wYAfFJOTvGv2e3SpTdpLKmtn58UHFxy29DQUpf10ksvae/evWrbtq2mTZsmSYqMjFR6erp69uyphx56SLNmzdK5c+f0xBNPaNCgQVqzZo3S09N17733aubMmbr77rt15swZff311zIMQxMnTlRKSoqysrKc4SIiIqJU9QwfPlz79u3T8uXLFRYWpieeeEK33Xabdu/erWrVqmn06NG6cOGCkpKSFBoaqt27d6t69eqSpL/85S/avXu3Vq5cqTp16uiHH37QuXPnSv1ZuFOFCjdnz56Vv3/hku12uyTJV25ufumwlGGYKxYDACz2yxdwkW67Tfrss1+369aVzp4tum3PntKlvSCNG5v33LmUC99H4eHhCggIUEhIiOrXr+/cn5iYqGuvvVbTp0937ps/f75iYmK0d+9eZWdnKy8vT7/73e8UGxsrSbrmmmucbYODg5Wbm1vonFdSEGo2bNigbt26STKXX4mJidGyZct0zz33KC0tTQMHDnS+V9OmTZ3Hp6WlqWPHjoqLi5MkNW7cuNTv7W6WDktlZ2crOTlZycnJkqTU1FQlJycrLS1NkjlfJiEhwdm+f//+WrJkiRITE7V//35t2LBBY8eOVefOnRUdHW3Fr3CZgnBz7lzJ4R8AgOJs27ZNX331lapXr+58tGrVSpL0448/qn379urdu7euueYa3XPPPXr99df1888/l+s9U1JS5O/vry5dujj31a5dWy1btlRKSookaezYsXr++efVvXt3Pfvss/r++++dbR955BG9//776tChg/785z9r48aN5aqnPCwNN1u3blXHjh3VsWNHSdKECRPUsWNHPfPMM5Kk9PR0Z9CRzO6yWbNmae7cuWrbtq3uuecetWzZUkuWLLGk/qJUry6FhJjPGZoCAB+RnV3846OPCrc9frz4titXFm574MDlbdzA4XCof//+zg6Agse+fft04403ym63a/Xq1Vq5cqXatGmjl19+WS1btlRqamqZ37O4ERDDMGT7ZRhi5MiR2r9/v+6//37t3LlTcXFxzot64uPjdfDgQY0bN05HjhxR7969NXHixDLXUy5GFZOZmWlIMjIzMz32Ho0bG4ZkGN9847G3AAD8xrlz54zdu3cb586ds7oUl9xyyy3GmDFjCu176qmnjJYtWxoXL14s1Tny8vKMBg0aGC+88IJhGIbx0EMPGXfccccVj+vZs6fx+OOPG4ZhGHv37jUkGRs2bHC+npGRYQQHBxuLFy8u8vgnn3zSuOaaa4p87dVXXzVq1KhRqvoLlPRv6Mr3d4W6Wqqi4HJwAEBpNW7cWN9++60OHDigjIwM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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def SGD(num_epoch, learning_rate, batch_size):\n",
    "    # 拼接原始矩阵\n",
    "    X = np.concatenate([x_train, np.ones((len(x_train), 1))], axis=-1)\n",
    "    X_test = np.concatenate([x_test, np.ones((len(x_test), 1))], axis=-1)\n",
    "    # 随机初始化参数\n",
    "    theta = np.random.normal(size=X.shape[1])\n",
    "\n",
    "    # 随机梯度下降\n",
    "    # 为了观察迭代过程，我们记录每一次迭代后在训练集和测试集上的均方根误差\n",
    "    train_losses = []\n",
    "    test_losses = []\n",
    "    for i in range(num_epoch):\n",
    "        # 初始化批量生成器\n",
    "        batch_g = batch_generator(X, y_train, batch_size, shuffle=True)\n",
    "        train_loss = 0\n",
    "        for x_batch, y_batch in batch_g:\n",
    "            # 计算梯度\n",
    "            grad = x_batch.T @ (x_batch @ theta - y_batch)\n",
    "            # 更新参数\n",
    "            theta = theta - learning_rate * grad / len(x_batch)\n",
    "            # 累加平方误差\n",
    "            train_loss += np.square(x_batch @ theta - y_batch).sum()\n",
    "        # 计算训练和测试误差\n",
    "        train_loss = np.sqrt(train_loss / len(X))\n",
    "        train_losses.append(train_loss)\n",
    "        test_loss = np.sqrt(np.square(X_test @ theta - y_test).mean())\n",
    "        test_losses.append(test_loss)\n",
    "\n",
    "    # 输出结果，绘制训练曲线\n",
    "    print('回归系数：', theta)\n",
    "    return theta, train_losses, test_losses\n",
    "\n",
    "# 设置迭代次数，学习率与批量大小\n",
    "num_epoch = 20\n",
    "learning_rate = 0.01\n",
    "batch_size = 32\n",
    "# 设置随机种子\n",
    "np.random.seed(0)\n",
    "\n",
    "_, train_losses, test_losses = SGD(num_epoch, learning_rate, batch_size)\n",
    "    \n",
    "# 将损失函数关于运行次数的关系制图，可以看到损失函数先一直保持下降，之后趋于平稳\n",
    "plt.plot(np.arange(num_epoch), train_losses, color='blue', \n",
    "    label='train loss')\n",
    "plt.plot(np.arange(num_epoch), test_losses, color='red', \n",
    "    ls='--', label='test loss')\n",
    "# 由于epoch是整数，这里把图中的横坐标也设置为整数\n",
    "# 该步骤也可以省略\n",
    "plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('RMSE')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "cell_id": "3a4a37ec15aa42f9bfd69128c327fce9",
    "deepnote_app_coordinates": {
     "h": 5,
     "w": 12,
     "x": 0,
     "y": 0
    },
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 439,
    "execution_start": 1670941372322,
    "source_hash": "682d3cef",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归系数： [0.64542258 0.47047873 0.33188398 0.00325404 0.42479699 0.00237965]\n",
      "回归系数： [0.59247915 0.58561574 0.26554358 0.10173112 0.49435997 0.13108641]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, loss1, _ = SGD(num_epoch=num_epoch, learning_rate=0.1, \n",
    "    batch_size=batch_size)\n",
    "_, loss2, _ = SGD(num_epoch=num_epoch, learning_rate=0.001, \n",
    "    batch_size=batch_size)\n",
    "plt.plot(np.arange(num_epoch), loss1, color='blue', \n",
    "    label='lr=0.1')\n",
    "plt.plot(np.arange(num_epoch), train_losses, color='red', \n",
    "    ls='--', label='lr=0.01')\n",
    "plt.plot(np.arange(num_epoch), loss2, color='green',\n",
    "    ls='-.', label='lr=0.001')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('RMSE')\n",
    "plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "cell_id": "ab7fb357b0fd435d822fe4a294c982a2",
    "deepnote_app_coordinates": {
     "h": 5,
     "w": 12,
     "x": 0,
     "y": 0
    },
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 374,
    "execution_start": 1670941525843,
    "source_hash": "b6b01427",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归系数： [ 1.02026986e+76 -1.13520942e+76  9.19402885e+75  5.66309332e+75\n",
      " -4.91083973e+75  5.35399839e+75]\n",
      "最终损失： 5.336762494108163e+77\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, loss3, _ = SGD(num_epoch=num_epoch, learning_rate=1.5, batch_size=batch_size)\n",
    "print('最终损失：', loss3[-1])\n",
    "plt.plot(np.arange(num_epoch), np.log(loss3), color='blue', label='lr=1.5')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('log RMSE')\n",
    "plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "deepnote": {},
  "deepnote_app_layout": "article",
  "deepnote_execution_queue": [],
  "deepnote_notebook_id": "8b4b472deff24300a73fc652e8cf55b0",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
